package impl

import (
	"context"

	"gitee.com/keepalived_0807/Vblog/apps/user"
	"gitee.com/keepalived_0807/Vblog/common"
	"gitee.com/keepalived_0807/Vblog/conf"
	"gitee.com/keepalived_0807/Vblog/ioc"
	"gorm.io/gorm"
)

// 需要资源
// 需要数据操作

// func NewUserServiceImpl() *UserServiceImpl {
// 	return &UserServiceImpl{
// 		db: conf.C().MySQL.GetDB(),
// 	}
// }

func init() {
	ioc.Controller.Registry(user.AppName, &UserServiceImpl{})
}

type UserServiceImpl struct {
	// db conn
	db *gorm.DB
}

func (i *UserServiceImpl) Init() error {
	i.db = conf.C().MySQL.GetDB()
	return nil
}

func (i *UserServiceImpl) CreateUser(ctx context.Context, in *user.CreateUserRequest) (*user.User, error) {
	// 1、校验请求合法性
	if err := common.Validate(in); err != nil {
		return nil, err
	}
	// 不要存储明文密码
	if err := in.HashPassword(); err != nil {
		return nil, err
	}

	ins := user.NewUser(in)
	// INSERT INTO `users` (`created_at`,`updated_at`,`username`,`password`,`role`,`label`) VALUES (1721547810,1721547810,'wudi','123456',0,'{}')
	if err := i.db.WithContext(ctx).Save(ins).Error; err != nil {
		return nil, err
	}

	// 2、创建user对象
	// 3、user 对象保持入库
	// 4、返回保持后的user对象
	// i.db.Save("")
	return ins, nil
}

// 怎么查询用户：根据过滤条件去数据库中过滤出具体的资源
func (i *UserServiceImpl) QueryUser(ctx context.Context, in *user.QueryUserRequest) (*user.UserSet, error) {
	// 构造一个查询语句

	set := user.NewUserSet()
	query := i.db.Model(&user.User{}).WithContext(ctx)
	if in.Username != "" {
		// query 返回了一个新的对象
		query = query.Where("username = ?", in.Username)
	}

	if err := query.Count(&set.Total).Error; err != nil {
		return nil, err
	}
	if err := query.Offset(in.Offset()).Limit(in.PageSize).Find(&set.Items).Error; err != nil {
		return nil, err
	}
	return set, nil
}
